home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks ’92 / NotificationMon ƒ / NotificationMon.ƒ / Source / NotificationPrefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-22  |  4.1 KB  |  167 lines  |  [TEXT/KAHL]

  1. #include "NotificationMon.h"
  2.  
  3. #define PrefsID         128
  4. #define PrefsOK         1
  5. #define PrefsCAN         2
  6. #define PrefsFlash        6
  7. #define PrefsHide        5
  8. #define PrefsBGSleep     3
  9. #define PrefsFGSleep     4
  10. #define PrefsHilite        9
  11.  
  12. #define ENTER_KEY         0x03
  13. #define TAB_KEY            0x09
  14. #define BACKSPACE_KEY     0x08
  15. #define RETURN_KEY         0x0D
  16. #define ESCAPE_KEY      0x1B
  17. #define ABORT_KEY        '.'
  18.  
  19. pascal void HiliteItemProc(WindowPtr wp, short item);
  20.  
  21. Boolean IsCursorControlKey(char key)
  22. {
  23.     Boolean result = false;
  24.  
  25.     if ( (key >= 0x28) && (key <= 0x31) )
  26.         result = true;
  27.     else if(key == TAB_KEY)
  28.         result = true;
  29.     else if(key == BACKSPACE_KEY)
  30.         result = true;
  31.  
  32.     return result;
  33. }
  34.  
  35. pascal Boolean PrefsFilter(DialogPtr dp, EventRecord *event, short *item)
  36. {
  37.     Boolean    result = false;
  38.     char    key;
  39.     long    endTicks;
  40.     Boolean cmdKeyDown;
  41.     
  42.     if( ! ((event->what == keyDown) || (event->what == autoKey)) )
  43.         return false;
  44.         
  45.     key = (char)event->message & charCodeMask;
  46.     cmdKeyDown = (Boolean)((event->modifiers & cmdKey) != false);
  47.     if ( (key == RETURN_KEY)  || (key == ENTER_KEY) ||
  48.         (cmdKeyDown && ((key == 'O') || (key == 'o'))) ) {
  49.         SetDialogCtlHilite(dp,PrefsOK,1);
  50.         Delay(15, &endTicks);
  51.         SetDialogCtlHilite(dp,PrefsOK,0);
  52.         Delay(10, &endTicks);
  53.         result = true;
  54.         *item = PrefsOK;
  55.     } else if((key == ESCAPE_KEY) 
  56.                 || ( (cmdKeyDown) 
  57.                     && ( (key == '.') 
  58.                         || (key == '`')
  59.                         || (key == 'c') || (key == 'C') ))) {
  60.         
  61.         SetDialogCtlHilite(dp,PrefsCAN,1);
  62.         Delay(15,&endTicks);
  63.         SetDialogCtlHilite(dp,PrefsCAN,0);
  64.         Delay(10,&endTicks);
  65.         result = true;
  66.         *item = PrefsCAN;
  67.     } else if(IsCursorControlKey(key)) {
  68.         result = false;
  69.     } else if( (key < '0') || (key > '9') ) {
  70.         SysBeep(5);
  71.         result = true;
  72.     }
  73.     
  74.     return result;
  75. }
  76.  
  77. void DoNotificationPrefsDialog(notificationDoc *nmd)
  78. {
  79.     DialogPtr    dp;
  80.     short        itemHit;
  81.     
  82.     dp = GetNewDialog(PrefsID,nil,(WindowPtr)-1);
  83.     SetDialogCtlValue(dp,PrefsHide,nmd->prefs.hideWindowInBackground);
  84.     SetDialogCtlValue(dp,PrefsFlash,nmd->prefs.notifyNewMessage);
  85.     PutNumericItem(dp,PrefsBGSleep,nmd->prefs.backTime);
  86.     PutNumericItem(dp,PrefsFGSleep,nmd->prefs.foreTime);
  87.     SetUserItemProc(dp, PrefsHilite, HiliteItemProc);
  88.     
  89.     ShowWindow(dp);
  90.     do {
  91.         ModalDialog(PrefsFilter,&itemHit);
  92.         switch(itemHit) {
  93.             case PrefsHide:
  94.             case PrefsFlash:
  95.                 SetDialogCtlValue(dp,itemHit,
  96.                     !GetDialogCtlValue(dp,itemHit));
  97.                     break;
  98.         }
  99.     } while( (itemHit != PrefsOK) && (itemHit != PrefsCAN));
  100.     
  101.     if(itemHit == PrefsOK) {
  102.         nmd->prefs.hideWindowInBackground = GetDialogCtlValue(dp,PrefsHide);
  103.         nmd->prefs.notifyNewMessage = GetDialogCtlValue(dp,PrefsFlash);
  104.         nmd->prefs.backTime = GetNumericItem(dp,PrefsBGSleep);
  105.         nmd->prefs.foreTime = GetNumericItem(dp,PrefsFGSleep);
  106.     }
  107.     DisposDialog(dp);
  108. }
  109.  
  110. void InitNotificationPrefs(notificationDoc *nmd)
  111. {
  112.     Handle    prefs;
  113.  
  114.     if(prefs = GetResource('PREF',128)) {
  115.         BlockMove(*prefs,&nmd->prefs,sizeof(prefRec));
  116.         ReleaseResource(prefs);
  117.         MoveWindow(&nmd->nWin.port,
  118.             nmd->prefs.windowLoc.left,
  119.             nmd->prefs.windowLoc.top,
  120.             false);
  121.         SizeWindow(&nmd->nWin,
  122.                     RECT_WIDTH(nmd->prefs.windowLoc),
  123.                     RECT_HEIGHT(nmd->prefs.windowLoc),
  124.                     false);
  125.     } else {
  126.         nmd->prefs.hideWindowInBackground = false;
  127.         nmd->prefs.notifyNewMessage = true;
  128.         nmd->prefs.backTime = 60 * 15;        /* Maybe every 15 seconds we run */
  129.         nmd->prefs.foreTime = 60 * 5;        /* we don't need much time */
  130.         /* leaving windowloc field uninitialized */
  131.     }
  132.     
  133. }
  134.  
  135. void UpdateNotificationPrefs(notificationDoc *nmd)
  136. {
  137.     prefRec    **prefs;
  138.     short    err;
  139.     
  140.     GetWindowGlobalRect(&nmd->nWin.port, 
  141.                     &nmd->nWin.port.portRect, 
  142.                     &nmd->prefs.windowLoc);
  143.                     
  144.     if(prefs = GetResource('PREF',128)) {
  145.         BlockMove(&nmd->prefs,*prefs,sizeof(prefRec));
  146.         ChangedResource(prefs);
  147.         if(err = ResError()) {
  148.             error("\pChangedResource fail in UpdateNotificationPrefs",err);
  149.             return;
  150.         }
  151.         ReleaseResource(prefs);
  152.     } else { 
  153.         prefs = NewHandle(sizeof(prefRec));
  154.         if(!prefs) {
  155.             error("\pError - update prefs failed.",MemError());
  156.             return;
  157.         }
  158.         BlockMove(&nmd->prefs,*prefs,sizeof(prefRec));
  159.         AddResource(prefs,'PREF',128,"\p");
  160.         if(err = ResError()) {
  161.             error("\pUpdateNotificationPrefs addres fail.",err);
  162.             return;
  163.         }
  164.         ReleaseResource(prefs);
  165.     }
  166. }
  167.